-- NO CORRER ESTE SCRIPT QUE TODAVIA NO ESTA LISTO!!

DECLARE
@clienteNombre NVARCHAR(255)
, @clienteApellido NVARCHAR(255)
, @clienteIdentificacion NUMERIC(18, 0)
, @clienteDireccion NVARCHAR(255)
, @clienteTelefono NUMERIC(18, 0)
, @clienteMail NVARCHAR(255)
, @clienteFechaNacimiento DATETIME
, @pasajeCodigo NUMERIC(18, 0)
, @pasajePrecio NUMERIC(18, 2)
, @pasajeFechaCompra DATETIME
, @butacaNumero NUMERIC(18, 0)
, @butacaUbicacionDescripcion NVARCHAR(255)
, @butacaPiso NUMERIC(18, 0)
, @paqueteCodigo NUMERIC(18, 0)
, @paquetePrecio NUMERIC(18, 2)
, @paquetePeso NUMERIC(18, 0)
, @paqueteFechaCompra DATETIME
, @viajeFechaSalida DATETIME
, @viajeFechaLlegadaEstimada DATETIME
, @viajeFechaLlegada DATETIME
, @recorridoCodigo NUMERIC(18, 0)
, @recorridoPrecioBaseKg NUMERIC(18, 2)
, @recorridoPrecioBasePasaje NUMERIC(18, 2)
, @recorridoCiudadOrigenNombre NVARCHAR(255)
, @recorridoCiudadDestinoNombre NVARCHAR(255)
, @microPatente NVARCHAR(255)
, @microModelo NVARCHAR(255)
, @microPesoDisponible NUMERIC(18, 0)
, @microMarca NVARCHAR(255)
, @tipoServicioDescripcion NVARCHAR(255)

-- READ_ONLY dramatically improves the performance of the cursor.
DECLARE cursorTablaMaestra CURSOR READ_ONLY

FOR
    SELECT
        *
    FROM gd_esquema.Maestra

-- The OPEN statement statement executes the SELECT statement and populates the result set.
OPEN cursorTablaMaestra

-- The FETCH statement returns a row from the result set into the variable. You can select multiple columns and return them into multiple variables.
FETCH NEXT FROM cursorTablaMaestra
INTO @clienteNombre
    , @clienteApellido
    , @clienteIdentificacion
    , @clienteDireccion
    , @clienteTelefono
    , @clienteMail
    , @clienteFechaNacimiento
    , @pasajeCodigo
    , @pasajePrecio
    , @pasajeFechaCompra
    , @butacaNumero
    , @butacaUbicacionDescripcion
    , @butacaPiso
    , @paqueteCodigo
    , @paquetePrecio
    , @paquetePeso
    , @paqueteFechaCompra
    , @viajeFechaSalida
    , @viajeFechaLlegadaEstimada
    , @viajeFechaLlegada
    , @recorridoCodigo
    , @recorridoPrecioBaseKg
    , @recorridoPrecioBasePasaje
    , @recorridoCiudadOrigenNombre
    , @recorridoCiudadDestinoNombre
    , @microPatente
    , @microModelo
    , @microPesoDisponible
    , @microMarca
    , @tipoServicioDescripcion

DECLARE @filaRecorrida NUMERIC(18, 0)
SET @filaRecorrida = 0;

-- The variable @@FETCH_STATUS is used to determine if there are any more rows. It will contain 0 as long as there are more rows.
WHILE @@FETCH_STATUS = 0

BEGIN

--     Creo el cliente, si corresponde.
    EXEC TUVAS.sp_altaCliente @clienteNombre, @clienteApellido, @clienteIdentificacion, @clienteDireccion, @clienteTelefono, @clienteFechaNacimiento, null, 0, 0, 0, @clienteMail

--     Creo la marca, si corresponde, y devuelvo el Id de la marca.
    DECLARE @microMarcaId          INT
    EXEC TUVAS.sp_altaMarca @microMarca, @microMarcaId OUTPUT

--     Creo el servicio, si corresponde, y devuelvo el Id del tipo de servicio.
    DECLARE @tipoServicioId        INT
    EXEC TUVAS.sp_altaServicio @tipoServicioDescripcion, @tipoServicioId OUTPUT;

--     Creo el micro, si corresponde, y devuelvo el Id del micro.
    EXEC TUVAS.sp_altaMicro @microPatente, @microModelo, @microMarcaId, @tipoServicioId, @microPesoDisponible;

--     Creo la ciudad de origen, si corresponde, Y devuelvo el Id de la ciudad.
-- TODO : Acá tengo que pasar un parámetro indicando si la creo como origen o destino, y existe como origen, pero la estoy creandoc omo destino, actualizarla.
-- TODO : Verificar que las 2 ciudades no sean las mismas (esto tendría que estar en un SP más genérico que sea el Alta de recorrido
    DECLARE @ciudadOrigenId        BIGINT
    EXEC TUVAS.sp_altaCiudad @recorridoCiudadOrigenNombre, @ciudadOrigenId OUTPUT

--  Creo la ciudad de destino, si corresponde, y devuelvo el Id de la ciudad.
    DECLARE @ciudadDestinoId       BIGINT
    EXEC TUVAS.sp_altaCiudad @recorridoCiudadDestinoNombre, @ciudadDestinoId OUTPUT

--     Creo el recorrido, si corresponde, y devuelvo el Id del recorrido.
    DECLARE @recorridoId           INT
    EXEC TUVAS.sp_altaRecorrido @recorridoCodigo, @ciudadOrigenId, @ciudadDestinoId, @recorridoPrecioBaseKg, @recorridoPrecioBasePasaje, @tipoServicioId, @recorridoId OUTPUT

--     Creo la ubicación de la butaca, la butaca, y la relación entre el micro y la butaca. Esto siempre y cuando no exista algo de todo esto.
    DECLARE @butacaUbicacionId     SMALLINT
    EXEC TUVAS.sp_altaButacaUbicacion @butacaUbicacionDescripcion, @butacaUbicacionId OUTPUT

    DECLARE @butacaId              NUMERIC(18, 0)
    EXEC TUVAS.sp_altaButaca @butacaNumero, @butacaPiso, @butacaUbicacionId, @microPatente, @butacaId OUTPUT

--     Crea un viaje, siempre y cuando la fecha de salida sea mayor a la fecha actual, la de estimada mayor a la de salida, si ya no existe en la BD,
--     y si los tipos de servicio del recorrido y del micro seleccionados son iguales.
    DECLARE @viajeId               NUMERIC(18, 0)
    EXEC TUVAS.sp_altaViaje @recorridoId, @microPatente, @viajeFechaSalida, @viajeFechaLlegada, @viajeFechaLlegadaEstimada, @viajeId OUTPUT

--     Creo los pasajes/encomiendas y la venta en sí.
    DECLARE @productoVendidoCodigo NUMERIC(18, 0)
    DECLARE @productoVendidoPrecio NUMERIC(18, 2)
    DECLARE @ventaFecha            DATETIME
    DECLARE @tipoProductoVendido   SMALLINT

    IF (@pasajePrecio <> 0)
        BEGIN
            SET @productoVendidoCodigo = @pasajeCodigo
            SET @productoVendidoPrecio = @pasajePrecio
            SET @ventaFecha = @pasajeFechaCompra
            SET @tipoProductoVendido = 1
        END
    ELSE
        BEGIN
            SET @productoVendidoCodigo = @paqueteCodigo
            SET @productoVendidoPrecio = @paquetePrecio
            SET @ventaFecha = @paqueteFechaCompra
            SET @tipoProductoVendido = 2
        END

    DECLARE @ventaId               NUMERIC(18, 0)
    EXEC TUVAS.sp_altaVenta @ventaFecha, @clienteIdentificacion, @productoVendidoPrecio, @ventaId OUTPUT

--     Doy de alta un producto vendido y además se ejecuta el trigger tg_altaPunto que agrega N registros a la tabla de puntos.
    EXEC TUVAS.sp_altaProductoVendido @productoVendidoCodigo, @tipoProductoVendido, @ventaId, @productoVendidoPrecio, @clienteIdentificacion, @butacaId, @paquetePeso


--         TODO : Borrar el logueo de cada fila.
    PRINT 'fila recorrida: '+cast(@filaRecorrida as char);
    SET @filaRecorrida = @filaRecorrida + 1
    
    --	Reseteo las variables porque quedan con el valor de la iteracion anterior.
    SET @microMarcaId=null
    SET @tipoServicioId=null
	SET @ciudadOrigenId=null
	SET @ciudadDestinoId=null
	SET @recorridoId=null
	SET @butacaUbicacionId=null
	SET @butacaId=null
	SET @viajeId=null
	

    FETCH NEXT FROM cursorTablaMaestra
    INTO @clienteNombre
        , @clienteApellido
        , @clienteIdentificacion
        , @clienteDireccion
        , @clienteTelefono
        , @clienteMail
        , @clienteFechaNacimiento
        , @pasajeCodigo
        , @pasajePrecio
        , @pasajeFechaCompra
        , @butacaNumero
        , @butacaUbicacionDescripcion
        , @butacaPiso
        , @paqueteCodigo
        , @paquetePrecio
        , @paquetePeso
        , @paqueteFechaCompra
        , @viajeFechaSalida
        , @viajeFechaLlegadaEstimada
        , @viajeFechaLlegada
        , @recorridoCodigo
        , @recorridoPrecioBaseKg
        , @recorridoPrecioBasePasaje
        , @recorridoCiudadOrigenNombre
        , @recorridoCiudadDestinoNombre
        , @microPatente
        , @microModelo
        , @microPesoDisponible
        , @microMarca
        , @tipoServicioDescripcion

END

-- The CLOSE statement releases the row set.
CLOSE cursorTablaMaestra

-- The DEALLOCATE statement releases the resources associated with a cursor.
DEALLOCATE cursorTablaMaestra;
